/**
 * 由于泛型提供了对类型结构的复用能力，我们也经常在 对象类型 结构中使用泛型。
 * 最常见的一个例子应该还是 响应类型结构 的泛型处理：
*/
interface IRes<TData = unknown> {
    code: number;
    error?: string;
    data: TData;
}

/**
 * 上面IRes接口，描述了一个通用的响应类型结构，预留出了实际响应数据的泛型坑位，
 * 然后在 请求函数 中就可以传入 特定的响应类型 了：
*/
interface IUserProfileRes {
    name: string;
    homepage: string;
    avatar: string;
}
function fetchUserProfile(): Promise<IRes<IUserProfileRes>> { return }
type StatusSucceed = boolean;
function handleOperation(): Promise<IRes<StatusSucceed>> { return }

/**
 * 泛型嵌套的场景也非常常用，比如对存在分页结构的数据，也可以将其分页的响应结构抽离出来：
*/
interface IPaginationRes<TItem = unknown> {
    data: TItem[];
    page: number;
    totalCount: number;
    hasNextPage: boolean;
}
//这些结构看起来很复杂，但其实就是简单的泛型参数填充而已
function fetchUserProfileList(): Promise<IRes<IPaginationRes<IUserProfileRes>>> { return }

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }